package com.recursion;

public class Queue8 {
    //表示共有多少个皇后
    final int MAX = 8;
    int[] array = new int[MAX];
    static int count = 0;

    public void printArr() {
        for (int arr : array) {
            System.out.print(arr + " ");
        }
        System.out.println();
    }

    /**
     * 判断当前皇后的位置是否冲突
     *
     * @param n 表示第n个皇后,数组从0开始，如n=2即为第3个皇后
     * @return
     */
    public boolean isConflict(int n) {
        /*
        判断当前皇后位置是否和之前的皇后处于同一列或同一斜线
        因为用一维数组表示皇后所在位置，如arr[n] = m表示第n+1行第m+1列，所以
        array[i] == array[n]：表示是否处于同一列
        n-i表示行的差值，array[n]-array[i]表示列的差值，两者相等时斜率为1，即在同一斜线上
         */
        for (int i = 0; i < n; i++) {
            if (array[i] == array[n] || Math.abs(n - i) == Math.abs(array[n] - array[i])) {
                return false;
            }
        }
        return true;
    }

    /**
     * @param n 表示第n个皇后
     */
    public void setQueue8(int n) {
        //n=8时也就是放置第9个皇后，即已完成
        if (n == MAX) {
            count++;
            printArr();
            return;
        }
        //通过For循环来进行回溯
        for (int i = 0; i < MAX; i++) {
            array[n] = i;
            if (isConflict(n)) {
                setQueue8(n + 1);
            }
            //但n以上的皇后全部放置好了以后，回退到第n个皇后的位置使列+1，再进行遍历
        }
    }

    public static void main(String[] args) {
        Queue8 test = new Queue8();
        test.setQueue8(0);
        System.out.println("一共有"+count+"种解法");
    }
}
